
import java.io.Serializable;

/**
 * Event.java - mallintaa yhtä kalenterimerkintää.
 * @author mikko
 */
public class Tapahtuma implements Serializable, Comparable {

    /**
     * Viikonpäivien määrä.
     */
    private final int viikonpaivia;
    /**
     * Tapahtuman nimi. Mikä tahansa merkkijono kelpaa arvoksi.
     */
    private String nimi;
    /**
     * Tapahtuman viikonpäivä. Arvot 1-7 missä 1 on maanantai ja 7 sunnuntai.
     */
    private int paiva;
    /**
     * Tapahtuman alkuaika. Hyväksyttävät arvot ovat kokonaisluvut
     * väliltä 0-23.
     */
    private int alkuAika;
    /**
     * Tapahtuman loppuaika. Hyväksyttävät arvot ovat kokonaisluvut
     * väliltä 1-24. Loppuajan on oltava suurempi kuin alkuajan.
     */
    private int loppuAika;
    /**
     * Tapahtuman sijainti. Mikä tahansa merkkijono kelpaa arvoksi.
     */
    private String sijainti;

    /**
     * Luo uuden tapahtuman. Olioviitteiden arvo on null ja int-tyyppiset arvot
     * alustetaan arvoon -1.
     */
    public Tapahtuma(int viikonpaivia) {
        this.viikonpaivia = viikonpaivia;
        this.paiva = -1;
        this.alkuAika = -1;
        this.loppuAika = -1;
    }

    /**
     * Kertoo tapahtuman alkuajan.
     * @return -1 jos alkuaikaa ei ole asetettu, muuten arvo väliltä 0-23.
     */
    public int getAlkuAika() {
        return alkuAika;
    }

    /**
     * Asettaa tapahtuman alkuajan. Jos annettu parametri on hyväksyttävällä
     * välillä niin asetetaan se tapahtuman alkuajaksi, muutoin tapahtuman
     * alkuaikaa ei muuteta.
     * @param alkuAika, kokonaisluku väliltä 0-23.
     * @return true jos alkuaika on asetettu, false jos muutos ei onnistunut.
     */
    public boolean setAlkuAika(int alkuAika) {

        if (alkuAika > -1 && alkuAika < 24) {
            this.alkuAika = alkuAika;
            return true;
        } else {
            return false;
        }
    }

    /**
     * Kertoo tapahtuman loppuajan.
     * @return -1 jos loppuaikaa ei ole asetettu, muutoin arvon väliltä 1-24.
     */
    public int getLoppuAika() {
        return loppuAika;
    }

    /**
     * Asettaa tapahtuman loppuajan. Jos annettu parametri on hyväksyttävällä
     * välillä niin asetetaan se tapahtuman alkuajaksi, muutoin tapahtuman
     * alkuaikaa ei muuteta. Loppuaika ei saa olla ennen alkuaikaa.
     * @param alkuAika, kokonaisluku väliltä 1-24.
     * @return true jos alkuaika on asetettu, false jos muutos ei onnistunut.
     */
    public boolean setLoppuAika(int loppuAika) {
        if (loppuAika > 0 && loppuAika < 25 && loppuAika > this.alkuAika) {
            this.loppuAika = loppuAika;
            return true;
        } else {
            return false;
        }

    }

    /**
     * Kertoo tapahtuman nimen.
     * @return null jos nimeä ei ole asetettu, muutoin tapahtuman nimen.
     */
    public String getNimi() {
        return nimi;
    }

    /**
     * Asettaa tapahtuman nimen.
     * @param nimi
     */
    public void setNimi(String nimi) {
        this.nimi = nimi;
    }

    /**
     * Palauttaa tapahtuman viikonpäivän, eli kokonaisluvun välillä 1-5 missä 1 on
     * maanantai ja 5 perjantai
     * @return -1 jos päivää ei ole asetettu, muutoin kokonaisluku väliltä 1-5.
     */
    public int getPaiva() {
        return paiva;
    }

    /**
     * Asettaa tapahtuman viikonpäivän. Jos annettu parametri on sallitulla välillä
     * niin asetetaan se tapahtuman päiväksi, jos parametri ei ole sallittu niin ei
     * muuteta mitään ja metodi palauttaa false.
     * @param paiva, kokonaisluku väliltä 1-5 missä 1 on maantai ja 5 perjantai
     * @return false jos muutosta ei tehty, true jos muutos onnistui
     */
    public boolean setPaiva(int paiva) {
        if (paiva > 0 && paiva <= viikonpaivia) {
            this.paiva = paiva;
            return true;
        } else {
            return false;
        }
    }

    /**
     * Kertoo tapahtuman sijainnin.
     * @return null jos sijaintia ei ole asetettu, muutoin tapahtuman sijainnin.
     */
    public String getSijainti() {
        return sijainti;
    }

    /**
     * Asettaa tapahtuman sijainnin.
     * @param sijainti
     */
    public void setSijainti(String sijainti) {
        this.sijainti = sijainti;
    }

    @Override
    public String toString() {
        String palautus = "";

        palautus += getAlkuAika();
        palautus += "-";
        palautus += getLoppuAika();
        palautus += " ";
        palautus += getNimi();
        palautus += " (";
        palautus += getSijainti();
        palautus += ")";

        return palautus;
    }

    public int compareTo(Object verrattava) {
        Tapahtuma verrattava2 = (Tapahtuma) verrattava;
        return this.alkuAika - verrattava2.getAlkuAika();
    }

    /**
     * Tarkistaa ovatko kaksi tapahtumaa samat tapahtumat.
     * Ovat siis samoja, jos kaikki kentät ovat samoja.
     * @param o Testattava objekti
     * @return true, jos ovat samoja, false muuten
     */
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Tapahtuma)) {
            return false;
        }

        Tapahtuma toinen = (Tapahtuma) o;

        return (this.alkuAika == toinen.alkuAika
                && this.loppuAika == toinen.loppuAika
                && this.nimi.equals(toinen.nimi)
                && this.paiva == toinen.paiva
                && this.sijainti.equals(toinen.sijainti));
    }
}
